package ofertas;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;

import modelo.Descuento;
import modelo.Producto;
import modelo.ProductoVendido;
import modelo.Venta;

public class ReglaPuntosPorVolumen implements ReglaPuntos {

	Map<Producto, Integer> cantidadesPorProducto;
	Map<Producto, Integer> puntosPorProducto;
	
	public ReglaPuntosPorVolumen() {
		this.cantidadesPorProducto = new HashMap<Producto, Integer>();
		this.puntosPorProducto = new HashMap<Producto, Integer>();	
	}
	
	@Override
	public List<Integer> aplicarRegla(Venta venta) {
		// TODO ACA !!!
		return null;
	}

	@Override
	public boolean encajaEnOferta(ProductoVendido producto) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean esDescuentoPosible(Descuento descuento) {
		// TODO Auto-generated method stub
		return false;
	}
	
	public int getPuntosPosibles(ProductoVendido productosVendidos) {
		int cantidad = productosVendidos.getCantidadDeProductos() / cantidadesPorProducto.get(this.obtenerClave( productosVendidos.getProducto() ) );
		int puntos = puntosPorProducto.get(this.obtenerClave( productosVendidos.getProducto() ) );
		return cantidad*puntos;
	}

	public void addProducto(Producto producto, int cantidad, int puntos) {

		cantidadesPorProducto.put(producto, cantidad);
		puntosPorProducto.put(producto, puntos);
	}
	
	private Producto obtenerClave(Producto p) {
		for(Producto clave : cantidadesPorProducto.keySet()) {
			if ( clave.equals(p) )
				return clave;
		}
		return null;
	}
	

	public void cargarDeArchivo(String datos) {
		Gson gson = new Gson();
		String tokens[] = datos.split(";");
		String productos[] = tokens[0].split("&");
		for (String tokenProducto : productos){
			if (tokenProducto.length()==0) continue;
			String partes[] = tokenProducto.split("!");
			Producto p = gson.fromJson(partes[0], Producto.class);
			cantidadesPorProducto.put(p, Integer.parseInt(partes[1]));
		}
		String puntos[] = tokens[1].split("&");
		for (String tokenProducto : puntos){
			if (tokenProducto.length()==0) continue;
			String partes[] = tokenProducto.split("!");
			Producto p = gson.fromJson(partes[0], Producto.class);
			puntosPorProducto.put(p,  Integer.parseInt(partes[1]));
		}
		
	}
	
	public boolean equals(ReglaPuntosPorVolumen otraRegla){
		boolean comp;
		comp = (otraRegla.puntosPorProducto.size() == this.puntosPorProducto.size());
		if (!comp) return false;
		comp = (otraRegla.cantidadesPorProducto.size() == this.cantidadesPorProducto.size());
		if (!comp) return false;
		return true;
	}
	
	public String serializar(){
		Gson gson = new Gson();
		StringBuffer res = new StringBuffer();
		for (Producto p: cantidadesPorProducto.keySet()){
			res.append(gson.toJson(p));
			res.append("!");
			res.append(cantidadesPorProducto.get(p));
			res.append("&");
		}
		res.append(";");
		for (Producto p: puntosPorProducto.keySet()){
			res.append(gson.toJson(p));
			res.append("!");
			res.append(puntosPorProducto.get(p));
			res.append("&");
		}
		return res.toString();
	}
	
}
